package com.knife.easyexcel.write.handler;

import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.util.BooleanUtils;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.handler.context.CellWriteHandlerContext;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.knife.easyexcel.write.entity.ColorCell;
import org.apache.poi.ss.usermodel.*;

import java.util.*;

/**
 * 单元格颜色设置 参考https://blog.csdn.net/ScholarTang/article/details/108024953
 */
public class ColorCellWriteHandler implements CellWriteHandler {
    /**
     * 需要处理的颜色单元格
     */
    private final List<ColorCell> colorCells;

    private final Map<String,CellStyle> cellStyleMap;


    public ColorCellWriteHandler(List<ColorCell> colorCells) {
        this.colorCells = colorCells;
        this.cellStyleMap = new HashMap<>();
    }

    @Override
    public void afterCellDispose(CellWriteHandlerContext context) {
        if (Objects.isNull(colorCells) || colorCells.size() == 0) {
            return;
        }
        // 当前事件会在 数据设置到poi的cell里面才会回调
        // 判断不是头的情况 如果是fill 的情况 这里会==null 所以用not true
        if (BooleanUtils.isNotTrue(context.getHead())) {
            Cell cell = context.getCell();
            Head head = context.getHeadData();
            int rowIndex = cell.getRowIndex();
            for (ColorCell colorCell : colorCells) {
                if (!colorCell.getHandleFlag() && colorCell.getRowIndex() == rowIndex) {
                    String fieldName = head.getFieldName();
                    for (ColorCell.ColorColumn colorColumn : colorCell.getStyleList()) {
                        if (colorColumn.getColumnName().equals(fieldName)){
                            // 第一个单元格
                            // 只要不是头 一定会有数据 当然fill的情况 可能要context.getCellDataList() ,这个需要看模板，因为一个单元格会有多个 WriteCellData
                            WriteCellData<?> cellData = context.getFirstCellData();
                            // 这里需要去cellData 获取样式
                            // 很重要的一个原因是 WriteCellStyle 和 dataFormatData绑定的 简单的说 比如你加了 DateTimeFormat
                            // ，已经将writeCellStyle里面的dataFormatData 改了 如果你自己new了一个WriteCellStyle，可能注解的样式就失效了
                            // 然后 getOrCreateStyle 用于返回一个样式，如果为空，则创建一个后返回
                            WriteCellStyle writeCellStyle = cellData.getOrCreateStyle();
                            writeCellStyle.setFillForegroundColor(colorColumn.getIndexedColors().getIndex());
                            // 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND
                            writeCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
                        }
                    }
                }
            }
        }
    }
}
